﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include <memory>//智能指针的头文件
using namespace std;

//几种常见的智能指针
//auto_ptr unique_ptr shared_ptr weak_ptr

/*
auto_ptr是C++98时设计出来的智能指针，他的特点是拷⻉时把被拷⻉对象的资源的管理权转移给拷⻉对象
但是这会导致被拷贝对象悬空 造成空指针 易出现访问报错的问题
*/

/*
unique_ptr是C++11设计出来的智能指针,他的特点的不⽀持拷⻉，只⽀持移动。但是移动后原对象也会被置空，移动要谨慎一点
*/

/*
shared_ptr是C++11设计出来的智能指针,他的特点是⽀持拷⻉，也⽀持移动,底层是⽤引⽤计数的⽅式实现的。
拷贝后原对象不会悬空  而移动后原对象会被置空变为nullptr
*/

struct Date
{
	int _year;
	int _month;
	int _day;

	Date(int year = 1, int month = 1, int day = 1)
		:_year(year)
		, _month(month)
		, _day(day)
	{
	}

	~Date()
	{
		cout << "~Date()" << endl;
	}
};


int main()
{
	auto_ptr<Date> ap1(new Date);
	// 拷贝时，管理权限转移，被拷贝对象ap1悬空
	auto_ptr<Date> ap2(ap1);

	//ap1->_year++;  此时已经置空 不能访问

	unique_ptr<Date> up1(new Date);
	//unique_ptr<Date> up2(up1);  不支持拷贝
	//但是支持移动 不过移动后原对象也会置空
	unique_ptr<Date> up2(move(up1));


	shared_ptr<Date> sp1(new Date);
	//支持拷贝和移动
	shared_ptr<Date> sp2(sp1);
	cout << sp1.use_count() << endl;//输出引用计数 即指向这块资源的指针个数

	shared_ptr<Date> sp3(move(sp1));

	//sp1->_day++;

	//cout << sp1->_year << endl;
	cout << sp2->_year << endl;
	cout << sp3->_year << endl;
	return 0;
}